#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>

#include "sc.h"

int main(int argc, char** argv) {
	initLogger();
	int fdout, fdin;
	char buf[MAX_BUF];
	int filein, fileout;
	int byteread;
	int flagNoFileInput = 0;
	char eseguicritt = 1;  //1 = critta, 0 = decritta
	char src[MAX_BUF];
	char dst[MAX_BUF];
	char secret_key[MAX_BUF];
	char c;
	opterr = 0;
	while ((c = getopt (argc, argv, "e:d:")) != -1)
		switch (c)
		{
			case 'e':
				eseguicritt = 1;
				memset(secret_key, 0, MAX_BUF);  
				memcpy(secret_key, optarg, strlen(optarg));
				break;
			case 'd':
				eseguicritt = 0;
				memset(secret_key, 0, MAX_BUF);  
				memcpy(secret_key, optarg, strlen(optarg));
				break;
			case '?':
				if (optopt == 'e' || optopt == 'd' )
					fprintf (stderr, "Option -%c requires an argument. (secret_key)\n", optopt);
				else if (isprint (optopt))
					fprintf (stderr, "Unknown option `-%c'.\nOpzioni disponibili -e -d\n", optopt);
				else
					fprintf (stderr,
							"Unknown option character `\\x%x'.\n",
							optopt);
				return 1;
			default:
				abort();
		}
	if (optind + 2 != argc) {
		fprintf (stderr, "USAGE:\n./client -e “secret_key” ./testo_originale ./testo_cifrato \n./client -d “secret_key” ./testo_cifrato ./testo_decifrato  \n", optopt);
        
		exit(1);
	}
	memset(src, 0, MAX_BUF);
	memset(dst, 0, MAX_BUF);
	memcpy(src, argv[optind], strlen(argv[optind]));
	optind++;
	memcpy(dst, argv[optind], strlen(argv[optind]));
	filein = open(src, O_RDONLY);
	if (filein == -1) {
		//il file non esiste quindi la stringa passata è il testo da crittare
		flagNoFileInput = 1;
		clientLog("Il file in input non esiste! La stringa passata è il dato da crittare!");
	}
	fileout = open(dst,O_WRONLY|O_CREAT);
	if (fileout == -1) {
		printf("errore creazione file output");
		exit(1);
	}
	chmod(dst, FILE_MODE);
	//apro le fifo
	clientLog("Apro le FIFO!");
	fdout = open("ClientToServer", O_RDWR|O_SYNC);
	fdin = open("ServerToClient", O_RDWR|O_SYNC);
	//invio la chiave
	write(fdout, &secret_key, strlen(secret_key)+1); //+1 perchè invio anche il terminatore
	clientLog("Chiave inviata!");
	//invio eseguicritt
	write(fdout, &eseguicritt, sizeof(eseguicritt));    
	clientLog("Operazione da eseguire inviata!");
	if (eseguicritt) {
		memset(buf, 0, MAX_BUF);
		int brs =read(fdin, &buf, MAX_BUF);
        clientLog("Ricevuto array random!");
		write(fileout, &buf, brs);
		clientLog("Scritto array random su file!");
	} 
	if (flagNoFileInput) {
		// se critto la stringa passata da comando da terminale
		write(fdout, &src, strlen(src)); 
		clientLog("Dati inviati!");
		int brs =  read(fdin, &buf, MAX_BUF);
		clientLog("Dati ricevuti!");
		write(fileout, &buf, brs);
	} else {
		byteread = 0;
		while ( ( byteread = read(filein, &buf, MAX_BUF)) != 0     ) {
			//invio buf al server
			write(fdout, &buf, byteread); 
			clientLog("Dati inviati!");
			memset(buf, 0, MAX_BUF);
			//ricevo la sua risposta e scrivo su file
			int brs =  read(fdin, &buf, MAX_BUF);
			clientLog("Dati ricevuti!");
			write(fileout, &buf, brs);
		}
	}
	clientLog("Chiusura FIFO!");
	close(fdout);
	close(fdin);
	close(fileout);
	close(filein);
	clientLog("Client exit!");
	closeLogger();
}